#ifndef _ds1302_H_
#define _ds1302_H_

#define UP() {SCLK=0;_nop_();SCLK=1;_nop_();}
#define DOWN() {SCLK=1;_nop_();SCLK=0;_nop_();}
sbit SCLK=P1^4;
sbit SDAT=P1^5;
sbit CE=P1^6;
void ds1302_writebyte(uchar byte){
	uint i;
	uint t=0x01;
	for(i=0;i<8;i++){
		SDAT=byte &t;
		t<<=1;
		DOWN();
	}
	SDAT=1;
}
void ds1302_writedata(uchar addr,uchar data_){
	CE=0;
	_nop_();
	SCLK=0;
	_nop_();
	CE=1;
	_nop_();
	ds1302_writebyte((addr<<1)|0x80);
	ds1302_writebyte(data_);
	CE=0;
	_nop_();
	

}
void ds1302_readbyte(){
	uint i;
	uchar data_=0;
	uint t=0x01;
	for(i=0;i<7;;i++){
		if(SDAT){
			data_=data_|t;
			
		}t<<=1;
		DOWN();
	}
}
void ds1302_readdata(uchar addr){
	uchar data_=0;
	CE=0;_nop_();
	SCLK=0;_nop_();
	CE=1;_nop_();
	ds1302_writebyte((addr<<1)|0x81);
	data_=ds1302_readbyte();
	CE=0;_nop_();
	SCLK=1;_nop_();
	SDAT=0;_nop_();
	SDAT=1;_nop_();
	return data_;
}
void init_ds1302(){
	uchar i;
	CE=0;
	SCLK=0;
	i=ds1302_readdata(0x00);
	if(i & 0x80 !=0){
		ds1302_writedata(7,0x00);
		for(i=0;i<7;i++){
			ds1302_writedata(i.init_time[i]);
		}
	}
}
void ds1302_readtime(){
	uint i;
	for(i=0;i<7;i++){
		init_time[i]=ds1302_readdata[i];
	}
}

#endif